import os
from flask import current_app

from database.user_repo import select_user_by_user_id, insert_user, update_user

from utils.date_format import is_within_30_minutes

from models.user_info import UserInfo

from api.weibo import get_user_info_api

from adapters.user_info import adapter_user_info

from spider.user_spider import download_user_avatar

from consts import USER_AVATAR_PATH
"""
1.先去数据库中查找这个数据
1.1 如果不存在就直接到第3步
1.2 如果存在就到第2步
2.判断数据库中的记录日期是否超过1天
2.1 如果超过一天，就直接到第三步
2.2 如果没超过一天直接从数据库取出数据返回
3.根据拿到的user_id进行爬虫业务
4.爬到的数据插入/更新到数据库，同时返回数据
"""
def user_info_service(user_id, cookie):
    res = select_user_by_user_id(user_id)
    # 1.在数据库中且不过期，直接返回
    if res and res['update_time'] and is_within_30_minutes(res['update_time']):
        user_info_class = UserInfo(**res)
        return user_info_class.json()
    try:
        # 2.开始爬数据/获取api
        # 2.1 获取基本数据
        weibo_user_info_json = get_user_info_api(user_id, cookie)
        # 2.2 下载图片
        download_user_avatar(weibo_user_info_json)
        # 2.3 获取数据库需要的数据
        valid_data = adapter_user_info(weibo_user_info_json)
        user_info_class = UserInfo(**valid_data)
    except Exception as e:
        return None
    # 3.插入/更新数据库
    if res:
        update_user(user_info_class)
    else:
        insert_user(user_info_class)
    return user_info_class.json()

def get_user_avatar_path():
    avatar_file = os.path.join(current_app.root_path, USER_AVATAR_PATH)
    return avatar_file

def upload_user_info_service(data):
    user_id = data['id']
    res = select_user_by_user_id(user_id)
    # 1.在数据库中且不过期，直接返回
    if res and res['update_time'] and is_within_30_minutes(res['update_time']):
        user_info_class = UserInfo(**res)
        return { 'finished': True }
    # 2.下载图片
    download_user_avatar(data)
    # 3 获取数据库需要的数据
    valid_data = adapter_user_info(data)
    user_info_class = UserInfo(**valid_data)
    # 4.插入/更新数据库
    if res:
        row_count = update_user(user_info_class)
    else:
        row_count = insert_user(user_info_class)
    if row_count == 0:
        return None
    else:
        return { 'finished': True }
    